import axios from 'axios'
import { ElLoading } from 'element-plus'
import Message from '@/utils/Message'
import Api from '@/utils/Api'
const contentTypeForm = 'application/x-www-form-urlencoded;charset=UTF-8'
const contentTypeJson = 'application/json'
const responseTypeJson = 'json'
let loading = null
// 创建axios实例
const instance = axios.create({
    withCredentials: true,//授权携带如cookie、session等头部信息
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL: (import.meta.env.PROD ? Api.prodDomain : "") + "/api", 
    // 超时，10s
    timeout: 10 * 1000
})
// request请求前拦截器
instance.interceptors.request.use(
    (config) => {
        if (config.showLoading) {
            loading = ElLoading.service({
                lock: true,
                text: '加载中......',
                background: 'rgba(0,0,0,0.7)'
            })
        }
        return config;
    },
    (error) => {
        if (error.config.showLoading && loading) {
            loading.close()
        }
        Message.error("请求发送失败")
        return Promise.reject("请求发送失败")
    }
)

// 响应(请求后)拦截器
instance.interceptors.response.use((res) => {
    const { showLoading, errorCallback, showError = true, responseType } = res.config;
    if (showLoading && loading) {
        loading.close()
    }
    const responseData = res.data
    if (responseType == "arraybuffer" || responseType == "blob") {
        return responseData
    }
    //正常请求
    if (responseData.code == 200) {
        return responseData
    } else if (responseData.code == 901) {
        //登陆超时
        setTimeout(() => {
            window.ipcRenderer.send('reLogin')
        }, 2000)
        return Promise.reject({ showError: true, msg: "登陆超时" })
    } else {
        if (errorCallback) {
            errorCallback(responseData)
        }
        return Promise.reject({ showError: showError, msg: responseData.info })
    }
},
    (error) => {
        if (error.config.showLoading && loading) {
            loading.close()
        }
        return Promise.reject({ showError: true, msg: "网络异常" })
    }
)
const request = (config) => {
    const { url, params, dataType, showLoading = true, responseType = responseTypeJson, showError = true } = config
    let contentType = contentTypeForm
    let formData = new FormData()
    for (let key in params) {
        formData.append(key, params[key] == undefined ? "" : params[key])
    }
    if (dataType != null && dataType == 'json') {
        contentType = contentTypeJson
    }
    const token = localStorage.getItem('token')
    let headers = {
        'Content-Type': contentType,
        'X-Requested-With': 'XMLHttpRequest',
        "token": token
    }
    return instance.post(url, formData, {
        headers: headers,
        showLoading: showLoading,
        errorCallback: config.errorCallback,
        showError: showError,
        responseType: responseType
    }).catch(error => {
        if (error.showError) {
            Message.error(error.msg)
        }
        return null
    })
}
export default request
